/**
 * 区块链交互接口入口
 */

// 通过truffle-contract加载合约交互接口
const TruffleContract = require("truffle-contract")
// import Web3 from "web3";
const Web3 = require("web3");
const $ = require('jquery')

// 导入配置信息模块
// import AppConfig from "./Config"      
const AppConfig = require("./Config"); 
const JSONUtils = require("./JSONUtils");

// let BlockChainApp = {
//     web3Provider: null,
//     contracts: {},
//     web3: undefined,
//     initState: false,

//     // 应用初始化
//     init: async function() {
//       console.log("state: ", this.initState)
//       if(this.initState)return;
//       this.initState = true;
//       console.log("init")
//       console.log(this.initState)
//       // 对应用进行的初始化
//       await this.initWeb3();
      
//     },
    
//     // web3交互接口初始化
//     initWeb3: async function() {
//       /*
//        * Replace me...
//        */
//       if(typeof web3 !== 'undefined'){
//         // 如果metamask已经实例化了web3交互接口模块
//         this.web3Provider = web3.currentProvider;
//         web3 = new Web3(web3.currentProvider);
//       }else{
//         // App.web3Provider = new Web3.providers.HttpProvider("http://localhost:8545")
//         this.web3Provider = new Web3.providers.HttpProvider(AppConfig.network_url)
//         web3 = new Web3(this.web3Provider)
//       }
//       this.web3 = web3
//       return this.initContract();
//     },
    
//     // 合约初始化
//     initContract: function() {
//       // 初始化用户合约
//       // jQuery.getJSON("User.json", function(user){
//       //   BlockChainApp.contracts.User = TruffleContract(user);
//       //   BlockChainApp.contracts.User.setProvider(BlockChainApp.web3Provider);
//       //   BlockChainApp.listenForEvents();
//       // })
//       // console.log("1231232", $)
//       this.contracts.User = TruffleContract(JSONUtils.readJSON("contract/User.json"))
//       this.contracts.User.setProvider(this.web3Provider);

//       //TODO，初始化其他合约
//       this.listenForEvents();
//       return this.bindEvents();
//     },
    
//     // 绑定智能合约事件到相应接口
//     bindEvents: function() {
//     //   $(document).on('click', '.btn-adopt', App.handleAdopt);
//     },
//     listenForEvents: function(){
//       // App.contracts.Election.deployed().then(function(instance){
//       //   instance.votedEvent({}, {
//       //     fromBlock: 0,          // 最新区块，如果从区块0开始，好像每一块的数据变化时都会触发事件
//       //     toBlock: 'latest'
//       //   }).watch(function(error, event){
//       //     console.log("event triggered", event);
//       //     // App.render();
//       //   })
//       // })
//     },

    
//     /**
//      * 解锁账户
//      * @param account 账户名
//      * @param password 密码
//      */
//     unlockAccount: async function(account, password) {
//       return this.web3.eth.personal.unlockAccount(account, password, 600)
//      },

//      /**
//      * 锁定账户
//      */
//     lockAccount: async function(account){
//       return web3.eth.personal.lockAccount(account)
//     }
   
// };

var BlockChainApp = (
  function(){
    var instance;

    function get(){
      return {
        web3Provider: null,
        contracts: {},
        web3: undefined,
        initState: false,

        // 应用初始化
        init: async function() {
          console.log("state: ", this.initState)
          if(this.initState)return;
          this.initState = true;
          console.log("init")
          console.log(this.initState)
          // 对应用进行的初始化
          await this.initWeb3();
          
        },
        
        // web3交互接口初始化
        initWeb3: async function() {
          /*
          * Replace me...
          */
          if(typeof web3 !== 'undefined'){
            // 如果metamask已经实例化了web3交互接口模块
            this.web3Provider = web3.currentProvider;
            web3 = new Web3(web3.currentProvider);
          }else{
            // App.web3Provider = new Web3.providers.HttpProvider("http://localhost:8545")
            this.web3Provider = new Web3.providers.HttpProvider(AppConfig.network_url)
            web3 = new Web3(this.web3Provider)
          }
          this.web3 = web3
          return this.initContract();
        },
        
        // 合约初始化
        initContract: function() {
          // 初始化用户合约
          this.contracts.User = TruffleContract(JSONUtils.readJSON("contract/User.json"))
          this.contracts.User.setProvider(this.web3Provider);
          
          // 初始化病历报告合约
          this.contracts.CaseRecords = TruffleContract(JSONUtils.readJSON("contract/CaseRecords.json"))
          this.contracts.CaseRecords.setProvider(this.web3Provider);
          
          // 初始化处方合约
          this.contracts.Prescription = TruffleContract(JSONUtils.readJSON("contract/Prescription.json"))
          this.contracts.Prescription.setProvider(this.web3Provider);

          // 初始化检查项目合约
          this.contracts.CheckProject = TruffleContract(JSONUtils.readJSON("contract/CheckProject.json"))
          this.contracts.CheckProject.setProvider(this.web3Provider);

          //TODO，其他需要添加的合约
          this.listenForEvents();
          return this.bindEvents();
        },
        
        // 绑定智能合约事件到相应接口
        bindEvents: function() {
        //   $(document).on('click', '.btn-adopt', App.handleAdopt);
        },
        listenForEvents: function(){
          // App.contracts.Election.deployed().then(function(instance){
          //   instance.votedEvent({}, {
          //     fromBlock: 0,          // 最新区块，如果从区块0开始，好像每一块的数据变化时都会触发事件
          //     toBlock: 'latest'
          //   }).watch(function(error, event){
          //     console.log("event triggered", event);
          //     // App.render();
          //   })
          // })
        },

        
        /**
         * 解锁账户
         * @param account 账户名
         * @param password 密码
         */
        unlockAccount: async function(account, password) {
          console.log("unlock: ", account, password)
          this.web3.eth.personal.unlockAccount(account, password, 600)
          .then(()=>{console.log("unlock success");return true;})
          .catch(err=>{console.log("unlock error:", err); return false;})
        },

        /**
         * 锁定账户
         */
        lockAccount: async function(account){
          return this.web3.eth.personal.lockAccount(account)
        }
      }
    }

    return {
      getInstance () {
        var ins = instance || (instance = get())
        ins.init()
        return ins; // 如果instance 变量是有值的就直接返回，如果是没有值的就调用生成对象返回并赋值给instance
      } 
    }
  }
)()

// BlockChainApp.init()


module.exports = BlockChainApp.getInstance()
// export default BlockChainApp;
